import { useAuth } from '@/composables/useAuth'

// 权限指令
const permission = {
  mounted(el, binding) {
    const { hasPermission, hasAnyPermission } = useAuth()
    const { value, modifiers } = binding
    
    if (!value) {
      console.warn('权限指令需要传入权限值')
      return
    }
    
    let hasAuth = false
    
    if (Array.isArray(value)) {
      // 数组权限，默认是OR关系，如果有all修饰符则是AND关系
      if (modifiers.all) {
        hasAuth = value.every(permission => hasPermission(permission))
      } else {
        hasAuth = hasAnyPermission(value)
      }
    } else {
      // 单个权限
      hasAuth = hasPermission(value)
    }
    
    if (!hasAuth) {
      // 没有权限时的处理
      if (modifiers.hidden) {
        // 隐藏元素
        el.style.display = 'none'
      } else if (modifiers.disabled) {
        // 禁用元素
        el.disabled = true
        el.style.cursor = 'not-allowed'
        el.style.opacity = '0.5'
      } else {
        // 默认移除元素
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  },
  
  updated(el, binding) {
    // 权限变化时重新检查
    this.mounted(el, binding)
  }
}

// 角色指令
const role = {
  mounted(el, binding) {
    const { hasRole, hasAnyRole } = useAuth()
    const { value, modifiers } = binding
    
    if (!value) {
      console.warn('角色指令需要传入角色值')
      return
    }
    
    let hasAuth = false
    
    if (Array.isArray(value)) {
      // 数组角色，默认是OR关系，如果有all修饰符则是AND关系
      if (modifiers.all) {
        hasAuth = value.every(role => hasRole(role))
      } else {
        hasAuth = hasAnyRole(value)
      }
    } else {
      // 单个角色
      hasAuth = hasRole(value)
    }
    
    if (!hasAuth) {
      // 没有权限时的处理
      if (modifiers.hidden) {
        // 隐藏元素
        el.style.display = 'none'
      } else if (modifiers.disabled) {
        // 禁用元素
        el.disabled = true
        el.style.cursor = 'not-allowed'
        el.style.opacity = '0.5'
      } else {
        // 默认移除元素
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  },
  
  updated(el, binding) {
    // 角色变化时重新检查
    this.mounted(el, binding)
  }
}

export { permission, role }

// 统一导出
export default {
  permission,
  role
}
